home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / bixdos.arc / PARK < prev    next >
Text File  |  1986-11-24  |  7KB  |  158 lines

  1. Variations on a theme.
  2.  
  3. This short program is an adaptation of the hard disk head parking utility that
  4. Barry Nance did in message #65.  Barry's program worked fine on WD - ST225 disk
  5. combinations, but failed on my true blue IBM/XT 10 meg'er (I almost hate to
  6. admit to that, but it's what I use at work, and the machine was there before I
  7. was!).  The DTC controller that IBM supplied does not do an actual seek until
  8. some read/write request is attempted.  I tried all sorts of ways to fool it
  9. into working with Barry's program, but no go.
  10.  
  11. What does work is to reset, then step the head out track by track until the
  12. last cylinder is reached.  To take care of partitioning schemes and other dirty
  13. tricks, I try to step the head past the end of the cylinder.  If the head is
  14. really and truely at the end of the disk, the controller will return a seek
  15. error, in which case the program terminates.  If not, it keeps trying until the
  16. expected seek error arrives.
  17.  
  18. WARNING TO CLONE BOARDS:  We've tried this program on the following
  19. combinations: 10-meg w/DTC controller, 10-meg w/WD controller, and 20-meg w/WD
  20. controller.  If you are not *absolutely sure* the algorithm described will work
  21. with your controller board without making all sorts of protesting noises, try
  22. it with timid feet the first time, ready to hit that big red button.
  23.  
  24. NOTE: At the end, the program disables all interrupts and halts.  This makes it
  25. easy to use in batch files for turn-key systems, and requires that the user
  26. actually turns the power off (with heads properly parked) before moving the
  27. computer.  The folks here at ICI use this program in our sales demo units,
  28. which are Compaq portables.
  29.  
  30. Assemble, link, and EXE2BIN this program to turn it into .COM format.
  31. Here goes.
  32.  
  33. ;-------------------------------------------------------------------------------
  34.         PAGE ,132
  35. ;
  36. ;   This program parks the head on the hard disk.  It moves the head to the last
  37. ; track (which is reserved for this purpose), and then halts the system.  This
  38. ; requires the system to be shut down after parking, and allows the PARK program
  39. ; to be used in batch files.  The code is a modification of a public domain
  40. ; program by Barry Nance as listed in the MS.DOS/COMMANDS conference in BIX.
  41. ;
  42. park    segment para public 'code'
  43.         assume  cs:park,ds:park,es:park
  44. ;
  45.         org     0100h
  46. ;
  47. start   proc    far
  48. ;
  49.         mov     ah,9                    ; copyright notice
  50.         mov     dx,offset promptc
  51.         int     33
  52. ;
  53.         mov     ax,1100h                ; recalibrate hard drive #0
  54.         mov     dx,0080h
  55.         int     19
  56.         jnc     hdisk
  57. ;
  58. no_hd:  mov     ah,9                    ; 'No hard disk ...'
  59.         mov     dx,offset prompte
  60.         int     33
  61.         mov     ah,76                   ; terminate, return error code FF
  62.         mov     al,0FFh
  63.         int     33
  64. ;
  65. hdisk:  mov     ax,0800h                ; get disk parameters for hard drive #0
  66.         mov     dx,0080h
  67.         int     19
  68. ;
  69.         xchg    ch,cl                   ; max cyl # = NNxxxxxx.NNNNNNNN
  70.         mov     dl,cl
  71.         mov     cl,6
  72.         shr     ch,cl
  73.         mov     cl,dl                   ; max cyl # = [cx]
  74.         inc     cx
  75.         inc     cx
  76. ;
  77.         mov     di,offset prompth       ; convert max cyl # to ASCII decimal
  78. conv1:  mov     ax,cx                   ; get # of cyl in ax
  79.         mov     dx,0                    ; clear dx for DIV instruction
  80.         mov     bx,1000
  81.         div     bx                      ; get 1000's in ax, rem in dx
  82.         cmp     ax,0                    ; any 1000's?
  83.         je      conv2
  84.         add     al,'0'                  ; convert to ascii
  85.         stosb
  86. conv2:  mov     ax,dx                   ; get remainder
  87.         mov     bl,100
  88.         div     bl                      ; get 100's in al, rem in ah
  89.         add     al,'0'                  ; convert 100's to ascii
  90.         stosb
  91. conv3:  mov     al,ah                   ; get remainder
  92.         mov     ah,0
  93.         mov     bl,10
  94.         div     bl                      ; get 10's in al, 1's in ax
  95.         add     al,'0'                  ; convert 10's to ascii
  96.         stosb
  97.         mov     al,ah                   ; get 1's
  98.         add     al,'0'                  ; convert 1's to ascii
  99.         stosb
  100. ;
  101.         push    cx
  102.         mov     ah,9                    ; '<cr> Parking the hard disk <cr>'
  103.         mov     dx,offset prompt1
  104.         int     33
  105.         mov     ah,9                    ; 'Moving the head(s) ....
  106.         mov     dx,offset prompt2
  107.         int     33
  108.         pop     cx
  109. ;
  110.         mov     seek_num,0001           ; step disk out to final cylinder
  111. verlp:  push    cx
  112.         mov     ax,0401h                ; verify
  113.         mov     cx,seek_num
  114.         mov     dx,0080h
  115.         int     19
  116. vl1:    add     seek_num,0100h          ; increment cyl number
  117.         jnc     vl2                     ; test for roll over to upper 2 bits
  118.         add     seek_num,0040h          ; finish incrementing cyl number
  119. vl2:    pop     cx
  120.         loop    verlp
  121. ;
  122. vl3:    mov     ax,0401h                ; this verify should fail if the heads
  123.         mov     cx,seek_num             ;  are truely at the last cyl
  124.         mov     dx,0080h
  125.         int     19
  126.         jc      endvl
  127. m_cyl:  mov     cx,1                    ; not at the last cyl, do loop once more
  128.         jmp     verlp
  129. ;
  130. endvl:  mov     ah,9                    ; 'System halted'
  131.         mov     dx,offset prompt3
  132.         int     33
  133.         cli                             ; halt system
  134.         hlt  
  135. ;
  136. start   endp
  137. ;
  138. seek_num dw     0
  139. ;
  140. cr      equ     0Dh
  141. lf      equ     0Ah
  142. ;
  143. promptc db      cr,lf
  144.         db      '  *** Hard Disk Head Parking Utility ***',cr,lf
  145.         db      '(C) Copyright - 1986 Intelligent Controls Inc.',cr,lf
  146.         db      '                     Mountlake Terrace, WA',cr,lf,lf,'$'
  147. prompt1 db      'Parking the hard disk',cr,lf,lf
  148.         db      'Number of cylinders: '
  149. prompth db      '$$$$$$'
  150. prompt2 db      cr,lf
  151.         db      'Moving head(s) to the last cylinder',cr,lf,lf,'$'
  152. prompt3 db      'System now ready to be moved',cr,lf
  153.         db      '*** System Halted ***',cr,lf,lf,'$'
  154. prompte db      cr,lf
  155.         db      'No hard disks in this system, returning to DOS',cr,lf,lf,'$'
  156. park    ends
  157.         end     start
  158.